就用Demo 這篇FB 當做範例好了
程式如下
void Main()
{
int? a = 1;
int? b = 1;
var c = a??0 - b??0;
c.Dump("c");
}
先用想的
首先 a??0 是指當a是null時,就替代成0
然而 a 跟 b 都不是null 所以都不會替換
想像中var c = 1-1;
所以c是零 對吧
實際上跑一次
居然跟我想的不一樣答案c是1
來分析看看原因
在看到var c = a??0 - b??0;
當a是1時 ??0 - b??0;
基本上就不會執行了
所以c就會是1
程式碼就等於var c = a;
那a是null的話呢 注意??後本來是0 我改成5 跟 30 了喔
void Main()
{
int? a = null;
int? b = 1;
var c = a??5 - b??30;
c.Dump("c");
}
先用想的
a??5 這次a是null 所以會被替換成5
問題來了 程式會執行後面的 - b??30;
嗎?
如果會執行 就會變成 var c = 5-1;
不會執行 var c = 5;
實際跑看看
答案是4表示是會執行- b??30;
那a跟b是null的話呢
void Main()
{
int? a = null;
int? b = null;
var c = a ?? 5 - b ?? 30;
c.Dump("c");
}
讓你想想答案是
?
?
?
?
?
跟你想的一樣嗎 來看看C#到底是怎樣看待這段code吧
再次出現 程式是按照我寫的跑 不是按照我想的跑
(語法糖夠甜吧)
最後回到最初的題目要怎樣寫才是按照我們本來想的呢
程式要跑過一次看到結果跟想的一樣才是真的
請不要修改過後測都不測就上正式機阿
PS. LINQPad 6 開始才有IL+Native的功能